/*
 * OrTest.h
 *
 * Created on : 24-05-2014
 *     Author : A.W. Janisse
 *
 * Version 1.0: 24-05-2014, Final release
 */

#include "gtest/gtest.h"
#include "Or.h"
#include "High.h"

/**
 * Deze test toon aan dat er het object aangemaakt en opgeruimd (delete) kan
 * worden.
 *
 * De test case is geslaag als de instantie van and niet NULL is en er geen runtime
 * error komen.
 */
TEST(OR, ConstructorDestructorTest)
{
    Or *orGate = new Or(0,0,"Or");
    ASSERT_TRUE(orGate != NULL);
    delete orGate;
}

/**
 * Deze test toon aan dat de logische OR functie het juiste reslutaat geeft.
 */
TEST(OR, LogicOrWorksOK)
{
    High *highGate = new High(10, 20, "High");
    Or *orGate = new Or(40,40,"Or");

    EXPECT_EQ(false, orGate->getOutputValue());
    orGate->connectEntryTo(highGate);
    EXPECT_EQ(true, orGate->getOutputValue());

    delete highGate;
    delete orGate;
}

/**
 * Deze test controleert of de OR gate de juiste drawing instruction levert. De drawing instruction is
 * een string waarin informatie staat over de gate zelf maar ook over de connections. In de opbouw
 * van de string wordt rekening gehouden met de logische toestand van de gate.
 */
TEST(OR, GetDrawingInstructions)
{
    High *h1 = new High(0,0,"High");
    High *h2 = new High(0,20,"High");
    h1->resetNextNumber();

    Gate * g1 = new Or(10, 15, "Or");
    EXPECT_EQ("gate,1,Or,10,15,2,L,L,L\n", g1->getDrawingInstruction());

    Gate * g2 = new Or(40, 50, "Or");
    EXPECT_EQ("gate,2,Or,40,50,2,L,L,L\n", g2->getDrawingInstruction());

    g1->connectEntryTo(h1);
    EXPECT_EQ("connection,H,8,3,10,17\ngate,1,Or,10,15,2,H,L,H\n", g1->getDrawingInstruction());

    g1->connectEntryTo(h2);
    EXPECT_EQ("connection,H,8,3,10,17\nconnection,H,8,23,10,19\ngate,1,Or,10,15,2,H,H,H\n", g1->getDrawingInstruction());

    delete h1;
    delete g1;
    delete g2;
}
